package cxy.highConcurrency;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

public class ForkJoinDemo {
	public static void main(String[] args) {

		// 创建分治任务线程池
		ForkJoinPool fjp = new ForkJoinPool(4);
		// 创建分治任务
		Fibonacci fib = new Fibonacci(30);
		// 启动分治任务
		Integer result = fjp.invoke(fib);
		// 输出结果
		System.out.println(result);
	}

	// 递归任务
	static class Fibonacci extends RecursiveTask<Integer> {

		private static final long serialVersionUID = 1L;

		final int n;

		Fibonacci(int n) {
			this.n = n;
		}

		protected Integer compute() {
			if (n <= 1) {
				return n;
			}
			Fibonacci f1 = new Fibonacci(n - 1);
			// 创建子任务
			f1.fork();
			Fibonacci f2 = new Fibonacci(n - 2);
			// 只需开启一个子任务，所以不需要调用f2.fork()
			// f2.fork();
			// 等待子任务结果，并合并结果    join() 方法则会阻塞当前线程来等待子任务的执行结果,先计算f(n-1)再计算f(n-2)
			return f2.compute() + f1.join();
		}
	}

}
